/*
定义person数据结构体
定义Saver接口保存方法
定义Person数据检查
encode 将person保存为json格式

*/
package defining_depenency_injection



import (
    `errors`
    `encoding/json`
)

// Saver persists the supplied bytes 保存程序保存提供的字节。
type Saver interface {
    Save(data []byte) error
}

// Person data object
type Person struct {
    Name  string
    Phone string
}

// validate the person object
func (self *Person) validate() error {
    if self.Name == "" {
        return errors.New("Name is required")
    }
    if self.Phone == "" {
        return errors.New("Phone is required")

    }
    return nil
}

// convert the person into bytes
func (self *Person) encode() ([]byte, error) {
    return json.Marshal(self)

}

// SavePerson will validate and persist the supplied person SavePerson将验证和坚持提供的人
func SavePerson(self *Person, saver Saver) error {
    //  validate the input
    if err := self.validate(); err != nil {
        return err
    }


    // encode person to  bytes
    bytes, err := self.encode()
    if err != nil {
        return err
    }

    // save the person and return the result
    return saver.Save(bytes)
}
